package com.dream.controller;

import com.dream.bean.Book;
import com.dream.bean.Cart;
import com.dream.bean.CartItem;
import com.dream.service.BookService;
import com.dream.utils.WebUtils;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 匠人码农
 * @date 2020/12/06 21:33
 * 概要：
 *     购物车模块
 */
@RequestMapping("/cart")
@Controller
public class CartController {

    /**
     * 转发前缀
     */
    private static final String REDIRECT ="redirect:";

    @Autowired
    BookService bookService;

    /**
     * 添加购物车功能
     * @param goodsIdStr  商品ID
     * @param req         请求
     * @return            请求页面
     */
    @RequestMapping("/addItem")
    protected String addItem(@RequestParam(value="goodsId") String goodsIdStr, HttpServletRequest req) {

        //商品id
        int goodsId = WebUtils.parseInt(goodsIdStr,0);

        //通过调用bookService获取图书信息
        Book book = bookService.queryBookById(goodsId);

        //把图书信息转换成cartItem信息
        CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(), book.getPrice());

        //创建购物车对象
        Cart cart = (Cart) req.getSession().getAttribute("cart");

        //购物车不存
        if(cart == null){
            //创建新的购物车
            cart = new Cart();
            //把购物车存放到session
            req.getSession().setAttribute("cart",cart);
        }

        //添加到cart
        cart.addItem(cartItem);

        //把最新的商品名称放到session
        req.getSession().setAttribute("lastGoodsName",book.getName());

        //重定向到首页
        return String.format("%s%s", REDIRECT, req.getHeader("Referer"));
    }

    /**
     * 删除购物车指定商品
     * @param goodsNoStr 商品ID
     * @param req        请求内容
     * @return           返回请求页面
     */
    @RequestMapping("/deleteItem")
    protected String deleteItem(@RequestParam(value="goodsId") String goodsNoStr, HttpServletRequest req) {

        //获取请求参数 商品id
        int goodsId = WebUtils.parseInt(goodsNoStr,0);

        //获取购物车对象
        Cart cart = (Cart) req.getSession().getAttribute("cart");

        //删除该商品
        cart.deleteItem(goodsId);

        //重定向到首页
        return String.format("%s%s", REDIRECT, req.getHeader("Referer"));
    }

    /**
     * 清空购物车
     * @param req 请求信息
     * @return 返回请求之前的页面
     */
    @RequestMapping("/clear")
    protected String clear(HttpServletRequest req) {

        //获取购物车对象
        Cart cart = (Cart) req.getSession().getAttribute("cart");

        if(cart != null) {
            //删除该商品
            cart.clear();

            //session无效
            req.getSession().invalidate();

        }

        //重定向到首页
        return String.format("%s%s", REDIRECT, req.getHeader("Referer"));
    }

    /**
     * 更新购物车商品件数
     * @param goodsIdStr    商品ID
     * @param goodsCountStr 商品件数
     * @param req           请求信息
     * @return              返回请求页面
     */
    @RequestMapping("/updateItem")
    protected String updateItem(@RequestParam(value="goodsId") String goodsIdStr,@RequestParam(value="goodsCount") String goodsCountStr, HttpServletRequest req) {

        //获取请求的商品ID
        int goodsId = WebUtils.parseInt(goodsIdStr,0);

        //获取请求的商品数量
        int goodsCount = WebUtils.parseInt(goodsCountStr,0);

        //获取购物车对象
        Cart cart = (Cart) req.getSession().getAttribute("cart");


        if(cart != null) {
            //修改商品数量
            cart.updateItem(goodsId,goodsCount);
        }

        //重定向到首页
        return String.format("%s%s", REDIRECT, req.getHeader("Referer"));
    }

    /**
     * 实现添加购物车的功能。（使用Ajax）
     *
     * @param req 请求信息
     * @param resp 响应信息
     * @throws IOException IO异常
     */
    @RequestMapping("/ajaxAddItem")
    protected void ajaxAddItem(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        //解决响应的中文乱码
        resp.setContentType("text/html;charset=utf-8");

        //获取请求参数
        int goodsId = WebUtils.parseInt(req.getParameter("goodsId"),0);

        //通过调用bookService获取图书信息
        Book book = bookService.queryBookById(goodsId);

        //把图书信息转换成cartItem信息
        CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(), book.getPrice());

        //创建购物车对象
        Cart cart = (Cart) req.getSession().getAttribute("cart");

        //购物车不存
        if(cart == null){

            //创建新的购物车
            cart = new Cart();
            //把购物车存放到session
            req.getSession().setAttribute("cart",cart);

        }

        //添加到cart
        cart.addItem(cartItem);

        //最后一个内容加入到session中
        req.getSession().setAttribute("lastGoodsName",book.getName());


        //存放给结果用的Map
        Map<String,Object> resultMap = new HashMap<>();

        //把结果放到map中
        resultMap.put("totalCount",cart.getTotalCount());
        resultMap.put("lastGoodsName",book.getName());

        Gson gson = new Gson();
        String json = gson.toJson(resultMap);

        //返回给客户端
        resp.getWriter().write(json);

    }
}
